package com.smart.community.payment.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.smart.community.commons.base.IBaseMapper;
import com.smart.community.payment.entity.Payment;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 支付Mapper接口
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-06-26
 */
@Mapper
public interface PaymentMapper extends IBaseMapper<Payment> {

    /**
     * 分页查询支付记录
     * 
     * @param page 分页参数
     * @param params 查询参数
     * @return 分页结果
     */
    IPage<Payment> selectPaymentPage(Page<Payment> page, @Param("params") Map<String, Object> params);

    /**
     * 根据用户ID查询支付记录
     * 
     * @param userId 用户ID
     * @return 支付记录列表
     */
    List<Payment> selectByUserId(@Param("userId") Long userId);

    /**
     * 根据社区ID查询支付记录
     * 
     * @param communityId 社区ID
     * @return 支付记录列表
     */
    List<Payment> selectByCommunityId(@Param("communityId") Long communityId);

    /**
     * 根据订单号查询支付记录
     * 
     * @param orderNo 订单号
     * @return 支付记录
     */
    Payment selectByOrderNo(@Param("orderNo") String orderNo);

    /**
     * 根据第三方订单号查询支付记录
     * 
     * @param thirdPartyOrderNo 第三方订单号
     * @return 支付记录
     */
    Payment selectByThirdPartyOrderNo(@Param("thirdPartyOrderNo") String thirdPartyOrderNo);

    /**
     * 根据业务类型和业务订单ID查询支付记录
     * 
     * @param businessType 业务类型
     * @param businessOrderId 业务订单ID
     * @return 支付记录列表
     */
    List<Payment> selectByBusinessOrder(@Param("businessType") Integer businessType, 
                                       @Param("businessOrderId") Long businessOrderId);

    /**
     * 根据支付状态查询支付记录
     * 
     * @param paymentStatus 支付状态
     * @return 支付记录列表
     */
    List<Payment> selectByPaymentStatus(@Param("paymentStatus") Integer paymentStatus);

    /**
     * 根据支付方式查询支付记录
     * 
     * @param paymentMethod 支付方式
     * @return 支付记录列表
     */
    List<Payment> selectByPaymentMethod(@Param("paymentMethod") Integer paymentMethod);

    /**
     * 查询指定时间范围内的支付记录
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 支付记录列表
     */
    List<Payment> selectByTimeRange(@Param("startTime") LocalDateTime startTime, 
                                   @Param("endTime") LocalDateTime endTime);

    /**
     * 统计用户支付总额
     * 
     * @param userId 用户ID
     * @return 支付总额
     */
    BigDecimal sumAmountByUserId(@Param("userId") Long userId);

    /**
     * 统计社区支付总额
     * 
     * @param communityId 社区ID
     * @return 支付总额
     */
    BigDecimal sumAmountByCommunityId(@Param("communityId") Long communityId);

    /**
     * 统计指定时间范围内的支付总额
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 支付总额
     */
    BigDecimal sumAmountByTimeRange(@Param("startTime") LocalDateTime startTime, 
                                   @Param("endTime") LocalDateTime endTime);

    /**
     * 统计各支付方式的支付金额
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    List<Map<String, Object>> sumAmountByPaymentMethod(@Param("startTime") LocalDateTime startTime, 
                                                       @Param("endTime") LocalDateTime endTime);

    /**
     * 统计各业务类型的支付金额
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    List<Map<String, Object>> sumAmountByBusinessType(@Param("startTime") LocalDateTime startTime, 
                                                      @Param("endTime") LocalDateTime endTime);

    /**
     * 统计各支付状态的记录数
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    List<Map<String, Object>> countByPaymentStatus(@Param("startTime") LocalDateTime startTime, 
                                                   @Param("endTime") LocalDateTime endTime);

    /**
     * 统计每日支付金额趋势
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 趋势数据
     */
    List<Map<String, Object>> selectDailyPaymentTrend(@Param("startDate") LocalDateTime startDate, 
                                                      @Param("endDate") LocalDateTime endDate);

    /**
     * 统计每月支付金额趋势
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 趋势数据
     */
    List<Map<String, Object>> selectMonthlyPaymentTrend(@Param("startDate") LocalDateTime startDate, 
                                                        @Param("endDate") LocalDateTime endDate);

    /**
     * 查询导出数据
     * 
     * @param params 查询参数
     * @return 导出数据列表
     */
    List<Payment> selectForExport(@Param("params") Map<String, Object> params);

    /**
     * 查询统计报表数据
     * 
     * @param communityId 社区ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计报表数据
     */
    List<Map<String, Object>> selectStatisticsReport(@Param("communityId") Long communityId, 
                                                     @Param("startDate") LocalDateTime startDate, 
                                                     @Param("endDate") LocalDateTime endDate);

    /**
     * 更新支付状态
     * 
     * @param id 支付ID
     * @param paymentStatus 支付状态
     * @param paymentTime 支付时间
     * @return 更新行数
     */
    int updatePaymentStatus(@Param("id") Long id, @Param("paymentStatus") Integer paymentStatus, 
                           @Param("paymentTime") LocalDateTime paymentTime);

    /**
     * 更新第三方支付信息
     * 
     * @param id 支付ID
     * @param thirdPartyOrderNo 第三方订单号
     * @param channelCode 渠道编码
     * @return 更新行数
     */
    int updateThirdPartyInfo(@Param("id") Long id, @Param("thirdPartyOrderNo") String thirdPartyOrderNo, 
                            @Param("channelCode") String channelCode);

    /**
     * 更新退款信息
     * 
     * @param id 支付ID
     * @param refundAmount 退款金额
     * @param refundReason 退款原因
     * @param refundTime 退款时间
     * @return 更新行数
     */
    int updateRefundInfo(@Param("id") Long id, @Param("refundAmount") BigDecimal refundAmount, 
                        @Param("refundReason") String refundReason, @Param("refundTime") LocalDateTime refundTime);

    /**
     * 批量更新支付状态
     * 
     * @param ids 支付ID列表
     * @param paymentStatus 支付状态
     * @return 更新行数
     */
    int batchUpdatePaymentStatus(@Param("ids") List<Long> ids, @Param("paymentStatus") Integer paymentStatus);

    /**
     * 删除过期支付记录
     * 
     * @param expireTime 过期时间
     * @return 删除行数
     */
    int deleteExpiredPayments(@Param("expireTime") LocalDateTime expireTime);

    /**
     * 统计待处理支付数量
     * 
     * @param communityId 社区ID
     * @return 待处理数量
     */
    int countPendingPayments(@Param("communityId") Long communityId);

    /**
     * 统计今日支付金额
     * 
     * @param communityId 社区ID
     * @return 今日支付金额
     */
    BigDecimal sumTodayPaymentAmount(@Param("communityId") Long communityId);

    /**
     * 统计本月支付金额
     * 
     * @param communityId 社区ID
     * @return 本月支付金额
     */
    BigDecimal sumMonthPaymentAmount(@Param("communityId") Long communityId);
}
